﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SistemaGO_Library.Persistencia.BD;

namespace SistemaGO_Library.Entidades.Terceiro
{
    class RepositorioTerceiro : IRepositorioTerceiro
    {
        private BD bd = new BD();

        //Descrição: Método que é usado nas regras de negócio do sistema identificando se um terceiro que o mesmo está querendo inserir ou procurar já existe no banco para evitar o cadastro em duplicidade.
        //Valores: cod = atributo identificador do terceiro que vai dizer se existe ou não.
        public bool existeTerceiro(int cod) {
            string sql = "SELECT terc_cod FROM tb_terceiros WHERE terc_cod = " + cod + " ";
            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    string exite = dr["terc_cod"].ToString();
                    contador = contador + 1;
                }

                if (contador > 0) {
                    return true;
                } else {
                    return false;
                }
            }
        }

        //Descrição: Método que realiza inserção de um terceiro no banco de dados.
        //Valores: ter = terceiro passado para que seja realizada a inserção caso ele esteja conforme com todas as regras de negócio.
        public void inserirTerceiro(Terceiro ter) {
            StringBuilder sql = new StringBuilder();
            sql.Append("INSERT INTO tb_terceiros (terc_nome, terc_email, terc_cnpj, terc_fone, end_av_rua, end_num, end_complemento, end_uf, end_cidade, end_bairro, end_cep) ");
            sql.Append("VALUES ('" + ter.Terc_nome + "', '" + ter.Terc_email + "', '" + ter.Terc_cnpj + "', '" + ter.Terc_fone + "', '" + ter.End_rua + "', " + ter.End_num + ", '" + ter.End_complemento + "', '" + ter.End_estado + "', '" + ter.End_cidade + "', '" + ter.End_bairro + "' ,'" + ter.End_cep + "')");
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que realiza busca de um terceiro no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca.
        public Terceiro buscarTerceiro(int cod) {
            Terceiro ter = new Terceiro();
            string sql = "SELECT * FROM tb_terceiros WHERE terc_cod = " + cod + " ";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                while (dr.Read()) {
                    ter.Terc_cod = int.Parse(dr["terc_cod"].ToString());
                    ter.Terc_nome = dr["terc_nome"].ToString();
                    ter.Terc_email = dr["terc_email"].ToString();
                    ter.Terc_cnpj = dr["terc_cnpj"].ToString();
                    ter.Terc_fone = dr["terc_fone"].ToString();
                    ter.End_rua = dr["end_av_rua"].ToString();
                    ter.End_num = int.Parse(dr["end_num"].ToString());
                    ter.End_complemento = dr["end_complemento"].ToString();
                    ter.End_estado = dr["end_uf"].ToString();
                    ter.End_cidade = dr["end_cidade"].ToString();
                    ter.End_bairro = dr["end_bairro"].ToString();
                    ter.End_cep = dr["end_cep"].ToString();
                }
                return ter;
            }
        }

        //Descrição: Método que realiza alteração de um terceiro no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca de qual terceiro ele irá alterar, novoTerceiro = novo terceiro que será inserido no lugar do antigo.
        public void alterarTerceiro(int cod, Terceiro novoTerceiro) {
            string sql;
            sql = "UPDATE tb_terceiros SET terc_nome = '" + novoTerceiro.Terc_nome + "', terc_email = '" + novoTerceiro.Terc_email + "', terc_cnpj = '" + novoTerceiro.Terc_cnpj + "', terc_fone = '" + novoTerceiro.Terc_fone + "', end_av_rua = '" + novoTerceiro.End_rua + "', end_num = " + novoTerceiro.End_num + ", end_complemento = '" + novoTerceiro.End_complemento + "', end_uf = '" + novoTerceiro.End_estado + "', end_cidade = '" + novoTerceiro.End_cidade + "', end_bairro = '" + novoTerceiro.End_bairro + "', end_cep = '" + novoTerceiro.End_cep + "' WHERE terc_cod = " + cod + " ";
            bd.rodarComando(sql);
        }

        //Descrição: Método que realiza exclusão de um terceiro no banco de dados.
        //Valores: cod = codigo passado para que seja realizada a busca no banco para exclusão.
        public void excluirTerceiro(int cod) {
            string sql;
            sql = "DELETE FROM tb_terceiros WHERE terc_cod = " + cod + " ";
            bd.rodarComando(sql.ToString());
        }

        //Descrição: Método que busca o código para ser mostrado na tela.
        //Valores: nenhum, visto que ele só busca o terceiro e retorna 
        public int buscarCodigoTerceiro() {
            string sql = "SELECT MAX(terc_cod) FROM tb_terceiros";
            return bd.buscarCodigo(sql) + 1;
        }

        //Descrição: Método que realiza o login do terceiro na Web. Ele retorna um terceiro para que fique registrado todas as operações feitas pelo mesmo.
        //Valores Passados: cod = codigo do terceiro, cnpj = cnpj do terceiro.
        public Terceiro logarTerceiro(int cod, string cnpj) {
            Terceiro terceiro = new Terceiro();
            string sql = "SELECT * FROM tb_terceiros WHERE terc_cod = " + cod + " and terc_cnpj = '" + cnpj + "'";

            using (SqlConnection conexao = new SqlConnection("Data Source=(local);Initial Catalog=SistemaGO;Integrated Security=True")) {
                conexao.Open();
                SqlCommand comando = new SqlCommand(sql, conexao);
                SqlDataReader dr = comando.ExecuteReader();
                int contador = 0;
                while (dr.Read()) {
                    terceiro.Terc_cod = int.Parse(dr["terc_cod"].ToString());
                    terceiro.Terc_nome = dr["terc_nome"].ToString();
                    terceiro.Terc_email = dr["terc_email"].ToString();
                    terceiro.Terc_cnpj = dr["terc_cnpj"].ToString();
                    terceiro.Terc_fone = dr["terc_fone"].ToString();
                    terceiro.End_rua = dr["end_av_rua"].ToString();
                    terceiro.End_num = int.Parse(dr["end_num"].ToString());
                    terceiro.End_complemento = dr["end_complemento"].ToString();
                    terceiro.End_estado = dr["end_uf"].ToString();
                    terceiro.End_cidade = dr["end_cidade"].ToString();
                    terceiro.End_bairro = dr["end_bairro"].ToString();
                    terceiro.End_cep = dr["end_cep"].ToString();
                }
                if (contador == 1) {
                    return terceiro;
                } else {
                    return null;
                }
            }
        }

        //Descrição: Método que valida se o cnpj é válido.
        //Valores: cnpj = cnpj do terceiro passado para verificação.
        public bool validaCnpj(string cnpj) {
            int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int soma;
            int resto;
            string digito;
            string tempCnpj;

            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

            if (cnpj.Length != 14)
                return false;

            tempCnpj = cnpj.Substring(0, 12);

            soma = 0;
            for (int i = 0; i < 12; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            digito = resto.ToString();

            tempCnpj = tempCnpj + digito;
            soma = 0;
            for (int i = 0; i < 13; i++)
                soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];

            resto = (soma % 11);
            if (resto < 2)
                resto = 0;
            else
                resto = 11 - resto;

            digito = digito + resto.ToString();

            return cnpj.EndsWith(digito);
        }
    }
}
